package com.irssproject.app.dao.lectorRSS.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;

import com.irssproject.app.bean.lectorRSS.Etiqueta;
import com.irssproject.app.bean.lectorRSS.Item;
import com.irssproject.app.bean.lectorRSS.Subscripcio;
import com.irssproject.app.dao.lectorRSS.iface.SubscripcioDAO;

public class SubscripcioDAOImpl extends SqlMapClientDaoSupport  {


	
	public void eliminarSubscripcio(String login, String feedLink) 
	{
	    Map<String,Object> subscripcioMap = new HashMap<String, Object>();
    	subscripcioMap.put("link", feedLink);
	    subscripcioMap.put("login", login);
	    
		int idSubsc = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioId", subscripcioMap);
		getSqlMapClientTemplate().delete("eliminarItemsSubscripcio",idSubsc);			
		getSqlMapClientTemplate().delete("eliminarSubscripcio", idSubsc);
	}

	@SuppressWarnings("unchecked")
	public List<Subscripcio> getListSubscripcions(String login) 
	{
		return (List<Subscripcio>) getSqlMapClientTemplate().queryForList("getListSubscripcions",login);
	}

	
	public boolean existeixSubscripcio(String login, String urlFeed) 
	{
	    Map<String,Object> subscripcioMap = new HashMap<String, Object>();

	    subscripcioMap.put("login", login);
	    subscripcioMap.put("link", urlFeed);

		int x = (Integer)getSqlMapClientTemplate().queryForObject("existeixSubscripcio",subscripcioMap);
		
		if (x==0) return false;
		else return true;
	}

	
	public void insertSubscripcio(Subscripcio subscripcio) 
	{
		String link = subscripcio.getFeed().getLink();
		String login = subscripcio.getUsuari().getLogin();
		
		int f = (Integer)getSqlMapClientTemplate().queryForObject("getFeedId", link);

	    int u = (Integer)getSqlMapClientTemplate().queryForObject("getUsuariId", login);

	    Map<String,Object> subscripcioMap = new HashMap<String, Object>();
	    
	    if (subscripcio.getEtiqueta()!=null){

	    	int e = (Integer)getSqlMapClientTemplate().queryForObject("getEtiquetaId", subscripcio.getEtiqueta().getNom());
	    	subscripcioMap.put("idetiqueta",e);

	    }

    	subscripcioMap.put("idFeed", f);
	    subscripcioMap.put("idUsuari", u);
	    subscripcioMap.put("dataSubscripcio", subscripcio.getDataSubscripcio());
	    		   		    
	    getSqlMapClientTemplate().insert("insertSubscripcio",subscripcioMap);		    	

	}

	@SuppressWarnings("unchecked")
	public List<String> getListEtiquetes(String login) 
	{
		return (List<String>)getSqlMapClientTemplate().queryForList("getListEtiquetes",login);
	}

	public Etiqueta getEtiqueta(String etiqueta) 
	{
		return (Etiqueta)getSqlMapClientTemplate().queryForObject("getEtiqueta",etiqueta);
	}

	@SuppressWarnings("unchecked")
	public void insertItemsNoLlegits(Subscripcio subscripcio, List<Item> itemsNoLlegits)
	{
		HashMap hm = new HashMap();

		HashMap subscMap = new HashMap();

		String feedLink = subscripcio.getFeed().getLink();
		
		subscMap.put("login", subscripcio.getUsuari().getLogin());
		subscMap.put("link",subscripcio.getFeed().getLink());

		int idSubsc = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioId", subscMap);
		int idFeed = (Integer)getSqlMapClientTemplate().queryForObject("getFeedId", feedLink);

		String itemURL;
		int idItem=10000;

		for(int i=0;i<itemsNoLlegits.size();i++){
			
			itemURL = itemsNoLlegits.get(i).getLink();
			
			hm = new HashMap();
			
			
			hm.put("idSubscripcio", idSubsc);
		    hm.put("idFeed", idFeed);
			hm.put("link", itemsNoLlegits.get(i).getLink());
			hm.put("titol", itemsNoLlegits.get(i).getTitol());
			hm.put("dataPublicacio", itemsNoLlegits.get(i).getDataPublicacio());
			hm.put("contingut", itemsNoLlegits.get(i).getContingut());
		    
		    //Afegim el contingut sencer del item
		    getSqlMapClientTemplate().insert("insertItems",hm);
		
		    //Obtenim el id autonumeric del item que acabem de posar
			idItem = (Integer)getSqlMapClientTemplate().queryForObject("getItemId", itemURL);
		    hm.put("idItem", idItem);
		
		    
		    hm.put("idItem", idItem);
			//Afegim la referencia dels no llegits sobre la subscripcio
		    getSqlMapClientTemplate().insert("insertItemsNoLlegits",hm);
		    idItem++;
		    
		}

	}

	@SuppressWarnings("unchecked")
	public void marcarItemComALlegit(String login, String feedURL,
			String itemURL) 
	{

		
		System.out.println("---- User: "+login+" ---> Item readed: "+itemURL);
		HashMap hm = new HashMap();
		
		hm.put("login", login);
		hm.put("link", feedURL);
		
		int idSubscripcio = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioId",hm);
		
		int idItem = (Integer)getSqlMapClientTemplate().queryForObject("getItemId", itemURL);
		hm.clear();
		hm.put("idsubscripcio", idSubscripcio);
		hm.put("iditem", idItem);
					
		getSqlMapClientTemplate().update("marcarItemComALlegit", hm);

	}


	@SuppressWarnings("unchecked")
	public Subscripcio getSubscripcio(String login, String feedURL) 
	{	
		HashMap hm = new HashMap();		
		hm.put("login", login);
		hm.put("feedURL", feedURL);
			
		return (Subscripcio)getSqlMapClientTemplate().queryForObject("getSubscripcio", hm);
		
	}


	@SuppressWarnings("unchecked")
	public Item getItem(String login, String itemURL) 
	{
		HashMap hm = new HashMap();
		hm.put("login", login);
		hm.put("itemURL", itemURL);

		return (Item)getSqlMapClientTemplate().queryForObject("getItem", hm);

	}

	public int getNumItemsSubscripcio(String login, String feedURL) 
	{
		HashMap<String,Object> hm = new HashMap<String,Object>();
		hm.put("login", login);
		hm.put("link", feedURL);
			
		return (Integer)getSqlMapClientTemplate().queryForObject("getNumItemsSubscripcio",hm);
	}



	

	public void insertItemIfRellevant(String login, String link, float temps)
	{
		HashMap<String,Object> hm = new HashMap<String,Object>();
			
		hm.put("login", login);
		hm.put("link", link);
			
		int idItemSubscripcio = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioIdByItem", hm);
			
		hm.clear();

		Integer idItemSubscripcioRellevant = 0;			
		hm.put("temps_lectura", temps);


		System.out.println("******************************************");

		
		if(idItemSubscripcioRellevant!=0)
		{
			hm.put("iditemsubscripcio", idItemSubscripcioRellevant);


			System.out.println("---- User ---> "+login);
			System.out.println("---- Updated Item --->  "+link);
			System.out.println("---- Reading time ---> "+temps+" seconds");



	//		getSqlMapClientTemplate().update("updateItemSubscripcioRellevant",hm);
			
		}
		else
		{
			hm.put("iditemsubscripcio", idItemSubscripcio);

			System.out.println("---- User ---> "+login);
			System.out.println("---- Saved Item --->  "+link);
			System.out.println("---- Reading time ---> "+temps+" seconds");



//			getSqlMapClientTemplate().insert("insertItemRellevant",hm);
		}
		System.out.println("******************************************");


	}



	public void updateSubscripcio(Subscripcio subscripcio) 
	{
		int f = (Integer)getSqlMapClientTemplate().queryForObject("getFeedId", subscripcio.getFeed().getLink());
		int u = (Integer)getSqlMapClientTemplate().queryForObject("getUsuariId", subscripcio.getUsuari().getLogin());

		Map<String,Object> subscripcioMap = new HashMap<String, Object>();
		    
		
		if (subscripcio.getEtiqueta()!=null){
			int e = (Integer)getSqlMapClientTemplate().queryForObject("getEtiquetaId", subscripcio.getEtiqueta().getNom()); 
			subscripcioMap.put("idetiqueta",e);
		}

	    subscripcioMap.put("idFeed", f);
		subscripcioMap.put("idUsuari", u);
			
	    getSqlMapClientTemplate().update("updateSubscripcioEtiqueta",subscripcioMap);
	    	
	}

	public void votarItem(String login, String itemURL, String magrada) 
	{
		HashMap<String,Object> hm = new HashMap<String,Object>();
		
		hm.put("login", login);
		hm.put("link", itemURL);
		
		int idItemSubscripcio = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioIdByItem", hm);

		hm.clear();
		
		hm.put("iditem_subscripcio", idItemSubscripcio);
		hm.put("valoracio", magrada);
		System.out.println("---- Voted item ---> "+itemURL+" ---> vote: "+magrada);
		getSqlMapClientTemplate().update("votarItem",hm);	
	}
	
	@SuppressWarnings("unchecked")
	public List<Item> getItemsNoLlegits(Subscripcio subscripcio) 
	{
		HashMap hm = new HashMap();
		hm.put("usuari", subscripcio.getUsuari().getLogin());		
		hm.put("feed", subscripcio.getFeed().getLink());
		List<Item> l = getSqlMapClientTemplate().queryForList("getItemsNoLlegits", hm);
		return l;
	}

	@SuppressWarnings("unchecked")
	public List<Item> getTotsItems(Subscripcio subscripcio) 
	{
		HashMap hm = new HashMap();
		hm.put("usuari", subscripcio.getUsuari().getLogin());
		hm.put("feed", subscripcio.getFeed().getLink());
		return (List<Item>) getSqlMapClientTemplate().queryForList("getTotsItems", hm);
	}


	@SuppressWarnings("unchecked")
	public List<Item> getItemsVotats(String usuari) 
	{
		return (List<Item>) getSqlMapClientTemplate().queryForList("getItemsVotats", usuari);
	}


	@SuppressWarnings("unchecked")
	public Date getDataDarrerItem(Subscripcio subscripcio) 
	{
		HashMap hm = new HashMap();
		hm.put("usuari", subscripcio.getUsuari().getLogin());
		hm.put("feed", subscripcio.getFeed().getLink());
		Date d = (Date)getSqlMapClientTemplate().queryForObject("getDataDarrerItem", hm);
		return d;
	}



	@SuppressWarnings("unchecked")
	public ArrayList getListSubscripcionsPerEtiqueta(String usuari,
			String etiqueta) 
	{
		HashMap<String,Object> hm = new HashMap<String, Object>();
			
		hm.put("usuari", usuari);
		hm.put("etiqueta", etiqueta);
			
		return (ArrayList)getSqlMapClientTemplate().queryForList("getListSubscripcionsPerEtiqueta",hm);
	}

	public void marcarLlegitONoLlegit(String login, String itemURL) {

	
	}

	public void definirRellevanciaItem(String login, String itemLink,
			int rellevancia) {

		HashMap<String,Object> hm = new HashMap<String, Object>();
		
		hm.put("login", login);
		hm.put("link", itemLink);

		int idItemSubscripcio = (Integer)getSqlMapClientTemplate().queryForObject("getSubscripcioIdByItem", hm);
		hm.clear();
		
		hm.put("iditemsubscripcio", idItemSubscripcio);
		hm.put("relevance", rellevancia);

		getSqlMapClientTemplate().update("defineItemRelevance", hm);
				
	}



}
